package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.ClienteDAO;
import mx.ipn.persistencia.dao.RfcDAO;
import mx.ipn.persistencia.dao.ClienteRfcDAO;
import mx.ipn.to.ClienteRfcTO;
import mx.ipn.to.ClienteTO;
import mx.ipn.to.RfcTO;

public class ClienteRfcDAOMySQL implements ClienteRfcDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(ClienteRfcDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO cliente_rfc (id_cliente,id_rfc,activo) VALUES(?,?,?)";
	private static final String DESACTIVA = "UPDATE cliente_rfc SET activo=false WHERE id_cliente_rfc=?";
	private static final String UPDATE = "UPDATE cliente_rfc SET id_cliente=?,id_rfc=?,activo=? WHERE id_cliente_rfc=?";
	private static final String FINDBYID = "SELECT * FROM cliente_rfc WHERE id_cliente_rfc=?";
	private static final String FINDBYIDCLIENTEIDRFC = "SELECT * FROM cliente_rfc WHERE id_cliente=? and id_rfc=?";
	private static final String SELECT = "SELECT * FROM cliente_rfc";
	private static final String SELECTACTIVO = "SELECT * FROM cliente_rfc where activo=true";
	private static final String SELECTACTIVOBYIDCLIENTE = "SELECT * FROM cliente_rfc WHERE activo=true and id_cliente=?";
	private static final String SELECTACTIVOBYIDRFC = "SELECT * FROM cliente_rfc WHERE activo=true and id_rfc=?";
	private static final String SELECTBYIDCLIENTE = "SELECT * FROM cliente_rfc WHERE id_cliente=?";
	private static final String SELECTBYIDRFC = "SELECT * FROM cliente_rfc WHERE id_rfc=?";

	@Override
	public short desActivaClienteRfc(int idClienteRfc) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(DESACTIVA);

			ps.setInt(1, idClienteRfc);

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			}

			else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

	@Override
	public ClienteRfcTO findClienteRfcById(int idClienteRfc) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idClienteRfc);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {

				boolean activo = rs.getBoolean("activo");
				int idCliente = rs.getInt("id_cliente");
				int idRfc = rs.getInt("id_rfc");
				// Crea la fabrica especifica de MySQL
				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
				// Crea un DAO para la tabla Cliente
				ClienteDAO clienteDAO = fabricaMySQL.getClienteDAO();
				RfcDAO rfcDAO = fabricaMySQL.getRfcDAO();

				ArrayList<RfcTO> rfcTO = new ArrayList<RfcTO>();
				ArrayList<ClienteTO> clienteTO = new ArrayList<ClienteTO>();

				rfcTO.add(rfcDAO.findRfcById(idRfc));
				clienteTO.add(clienteDAO.findClienteById(idCliente));

				ClienteTO[] arrClienteTO = (ClienteTO[])clienteTO.toArray(new ClienteTO[clienteTO.size()]);
				RfcTO[] arrRfcTO = (RfcTO[])rfcTO.toArray(new RfcTO[rfcTO.size()]);
		
				ClienteRfcTO clienteRfcTO = new ClienteRfcTO(idClienteRfc,
						activo, arrClienteTO, arrRfcTO);

				ps.close();
				conexion.close();
				return clienteRfcTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ClienteRfcTO findClienteRfcByIdClienteIdRfc(int idCliente, int idRfc) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion
					.prepareStatement(FINDBYIDCLIENTEIDRFC);

			ps.setInt(1, idCliente);
			ps.setInt(2, idRfc);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {
				int idClienteRfc = rs.getInt("id_cliente_rfc");
				boolean activo = rs.getBoolean("activo");
				// Crea la fabrica especifica de MySQL
				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
				// Crea un DAO para la tabla Cliente
				ClienteDAO clienteDAO = fabricaMySQL.getClienteDAO();
				RfcDAO rfcDAO = fabricaMySQL.getRfcDAO();

				ArrayList<RfcTO> rfcTO = new ArrayList<RfcTO>();
				ArrayList<ClienteTO> clienteTO = new ArrayList<ClienteTO>();

				rfcTO.add(rfcDAO.findRfcById(idRfc));
				clienteTO.add(clienteDAO.findClienteById(idCliente));

				ClienteTO[] arrClienteTO = (ClienteTO[])clienteTO.toArray(new ClienteTO[clienteTO.size()]);
				RfcTO[] arrRfcTO = (RfcTO[])rfcTO.toArray(new RfcTO[rfcTO.size()]);
		
				ClienteRfcTO clienteRfcTO = new ClienteRfcTO(idClienteRfc,
						activo, arrClienteTO, arrRfcTO);

				ps.close();
				conexion.close();
				return clienteRfcTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean insertClienteRfc(ClienteRfcTO clienteRfcTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setInt(1, clienteRfcTO.getIdCliente());
			ps.setInt(2, clienteRfcTO.getIdRfc());
			ps.setBoolean(3, clienteRfcTO.getActivo());
			ps.executeUpdate();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}

	}

	@Override
	public ClienteRfcTO selectClienteRfcActivoByIdCliente(int idCliente) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			ClienteDAO clienteDAO = null;
			RfcDAO rfcDAO = null;

			ClienteRfcTO clienteRfcTO = null;
			ArrayList<ClienteTO> clienteTO = null;
			ArrayList<Integer> listIdClienteRfc = null;
			ArrayList<RfcTO> rfcTO = null;
			ArrayList<Boolean> listActivo = null;
			PreparedStatement ps = conexion
					.prepareStatement(SELECTACTIVOBYIDCLIENTE);

			ps.setInt(1, idCliente);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdClienteRfc == null) {
					clienteTO = new ArrayList<ClienteTO>();
					listIdClienteRfc = new ArrayList<Integer>();
					rfcTO = new ArrayList<RfcTO>();
					listActivo = new ArrayList<Boolean>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					clienteDAO = fabricaMySQL.getClienteDAO();
					rfcDAO = fabricaMySQL.getRfcDAO();
				}

				listIdClienteRfc.add(rs.getInt("id_cliente_rfc"));
				rfcTO.add(rfcDAO.findRfcById(rs.getInt("id_rfc")));
				listActivo.add(true);
			}
			if (listIdClienteRfc != null) {
				clienteTO.add(clienteDAO.findClienteById(idCliente));
				
				ClienteTO[] arrClienteTO = (ClienteTO[])clienteTO.toArray(new ClienteTO[clienteTO.size()]);
				RfcTO[] arrRfcTO = (RfcTO[])rfcTO.toArray(new RfcTO[rfcTO.size()]);
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				Integer[] arrIdClienteRfc = (Integer[])listIdClienteRfc.toArray(new Integer[listIdClienteRfc.size()]);
				
				clienteRfcTO = new ClienteRfcTO(arrIdClienteRfc, arrClienteTO,
						arrRfcTO, arrActivo);
			}

			ps.close();
			conexion.close();
			return clienteRfcTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ClienteRfcTO selectClienteRfcActivoByIdRfc(int idRfc) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			ClienteDAO clienteDAO = null;
			RfcDAO rfcDAO = null;

			ClienteRfcTO clienteRfcTO = null;
			ArrayList<ClienteTO> clienteTO = null;
			ArrayList<Integer> listIdClienteRfc = null;
			ArrayList<RfcTO> rfcTO = null;
			ArrayList<Boolean> listActivo = null;
			PreparedStatement ps = conexion
					.prepareStatement(SELECTACTIVOBYIDRFC);

			ps.setInt(1, idRfc);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdClienteRfc == null) {
					clienteTO = new ArrayList<ClienteTO>();
					listIdClienteRfc = new ArrayList<Integer>();
					rfcTO = new ArrayList<RfcTO>();
					listActivo = new ArrayList<Boolean>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					clienteDAO = fabricaMySQL.getClienteDAO();
					rfcDAO = fabricaMySQL.getRfcDAO();
				}

				listIdClienteRfc.add(rs.getInt("id_cliente_rfc"));
				clienteTO.add(clienteDAO.findClienteById(rs
						.getInt("id_cliente")));
				listActivo.add(true);
			}
			if (listIdClienteRfc != null) {
				rfcTO.add(rfcDAO.findRfcById(idRfc));

				ClienteTO[] arrClienteTO = (ClienteTO[])clienteTO.toArray(new ClienteTO[clienteTO.size()]);
				RfcTO[] arrRfcTO = (RfcTO[])rfcTO.toArray(new RfcTO[rfcTO.size()]);
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				Integer[] arrIdClienteRfc = (Integer[])listIdClienteRfc.toArray(new Integer[listIdClienteRfc.size()]);
				
				clienteRfcTO = new ClienteRfcTO(arrIdClienteRfc, arrClienteTO,
						arrRfcTO, arrActivo);
			}

			ps.close();
			conexion.close();
			return clienteRfcTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ClienteRfcTO selectClienteRfcByIdCliente(int idCliente) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			ClienteDAO clienteDAO = null;
			RfcDAO rfcDAO = null;

			ClienteRfcTO clienteRfcTO = null;
			ArrayList<ClienteTO> clienteTO = null;
			ArrayList<Integer> listIdClienteRfc = null;
			ArrayList<RfcTO> rfcTO = null;
			ArrayList<Boolean> listActivo = null;
			PreparedStatement ps = conexion.prepareStatement(SELECTBYIDCLIENTE);

			ps.setInt(1, idCliente);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdClienteRfc == null) {
					clienteTO = new ArrayList<ClienteTO>();
					listIdClienteRfc = new ArrayList<Integer>();
					rfcTO = new ArrayList<RfcTO>();
					listActivo = new ArrayList<Boolean>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					clienteDAO = fabricaMySQL.getClienteDAO();
					rfcDAO = fabricaMySQL.getRfcDAO();
				}

				listIdClienteRfc.add(rs.getInt("id_cliente_rfc"));
				rfcTO.add(rfcDAO.findRfcById(rs.getInt("id_rfc")));
				listActivo.add(true);
			}
			if (listIdClienteRfc != null) {
				clienteTO.add(clienteDAO.findClienteById(idCliente));

				ClienteTO[] arrClienteTO = (ClienteTO[])clienteTO.toArray(new ClienteTO[clienteTO.size()]);
				RfcTO[] arrRfcTO = (RfcTO[])rfcTO.toArray(new RfcTO[rfcTO.size()]);
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				Integer[] arrIdClienteRfc = (Integer[])listIdClienteRfc.toArray(new Integer[listIdClienteRfc.size()]);
				
				clienteRfcTO = new ClienteRfcTO(arrIdClienteRfc, arrClienteTO,
						arrRfcTO, arrActivo);
			}

			ps.close();
			conexion.close();
			return clienteRfcTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ClienteRfcTO selectClienteRfcByIdRfc(int idRfc) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			ClienteDAO clienteDAO = null;
			RfcDAO rfcDAO = null;

			ClienteRfcTO clienteRfcTO = null;
			ArrayList<ClienteTO> clienteTO = null;
			ArrayList<Integer> listIdClienteRfc = null;
			ArrayList<RfcTO> rfcTO = null;
			ArrayList<Boolean> listActivo = null;
			PreparedStatement ps = conexion.prepareStatement(SELECTBYIDRFC);

			ps.setInt(1, idRfc);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdClienteRfc == null) {
					clienteTO = new ArrayList<ClienteTO>();
					listIdClienteRfc = new ArrayList<Integer>();
					rfcTO = new ArrayList<RfcTO>();
					listActivo = new ArrayList<Boolean>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					clienteDAO = fabricaMySQL.getClienteDAO();
					rfcDAO = fabricaMySQL.getRfcDAO();
				}

				listIdClienteRfc.add(rs.getInt("id_cliente_rfc"));
				clienteTO.add(clienteDAO.findClienteById(rs
						.getInt("id_cliente")));
				listActivo.add(true);
			}
			if (listIdClienteRfc != null) {
				rfcTO.add(rfcDAO.findRfcById(idRfc));

				ClienteTO[] arrClienteTO = (ClienteTO[])clienteTO.toArray(new ClienteTO[clienteTO.size()]);
				RfcTO[] arrRfcTO = (RfcTO[])rfcTO.toArray(new RfcTO[rfcTO.size()]);
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				Integer[] arrIdClienteRfc = (Integer[])listIdClienteRfc.toArray(new Integer[listIdClienteRfc.size()]);
				
				clienteRfcTO = new ClienteRfcTO(arrIdClienteRfc, arrClienteTO,
						arrRfcTO, arrActivo);
			}

			ps.close();
			conexion.close();
			return clienteRfcTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<ClienteRfcTO> selectClienteRfc() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			ClienteDAO clienteDAO = null;
			RfcDAO rfcDAO = null;

			ArrayList<ClienteRfcTO> clienteRfcTO = null;
			ClienteRfcTO clienteRfcTO2 = null;
			ArrayList<ClienteTO> clienteTO = null;
			ArrayList<RfcTO> rfcTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (clienteRfcTO == null) {
					clienteRfcTO = new ArrayList<ClienteRfcTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					clienteDAO = fabricaMySQL.getClienteDAO();
					rfcDAO = fabricaMySQL.getRfcDAO();
				}

				clienteTO = new ArrayList<ClienteTO>();
				rfcTO = new ArrayList<RfcTO>();
				clienteRfcTO2 = new ClienteRfcTO();

				clienteTO.add(clienteDAO.findClienteById(rs
						.getInt("id_cliente")));
				rfcTO.add(rfcDAO.findRfcById(rs.getInt("id_rfc")));
				
				ClienteTO[] arrClienteTO = (ClienteTO[])clienteTO.toArray(new ClienteTO[clienteTO.size()]);
				RfcTO[] arrRfcTO = (RfcTO[])rfcTO.toArray(new RfcTO[rfcTO.size()]);
				
				clienteRfcTO2 = new ClienteRfcTO(rs.getInt("id_cliente_rfc"),
						rs.getBoolean("activo"), arrClienteTO, arrRfcTO);

				clienteRfcTO.add(clienteRfcTO2);
			}
			ps.close();
			conexion.close();
			return clienteRfcTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<ClienteRfcTO> selectClienteRfcsActivo() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			ClienteDAO clienteDAO = null;
			RfcDAO rfcDAO = null;

			ArrayList<ClienteRfcTO> clienteRfcTO = null;
			ClienteRfcTO clienteRfcTO2 = null;
			ArrayList<ClienteTO> clienteTO = null;
			ArrayList<RfcTO> rfcTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTACTIVO);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (clienteRfcTO == null) {
					clienteRfcTO = new ArrayList<ClienteRfcTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					clienteDAO = fabricaMySQL.getClienteDAO();
					rfcDAO = fabricaMySQL.getRfcDAO();
				}

				clienteTO = new ArrayList<ClienteTO>();
				rfcTO = new ArrayList<RfcTO>();
				clienteRfcTO2 = new ClienteRfcTO();

				clienteTO.add(clienteDAO.findClienteById(rs
						.getInt("id_cliente")));
				rfcTO.add(rfcDAO.findRfcById(rs.getInt("id_rfc")));
				
				ClienteTO[] arrClienteTO = (ClienteTO[])clienteTO.toArray(new ClienteTO[clienteTO.size()]);
				RfcTO[] arrRfcTO = (RfcTO[])rfcTO.toArray(new RfcTO[rfcTO.size()]);
				
				clienteRfcTO2 = new ClienteRfcTO(rs.getInt("id_cliente_rfc"),
						rs.getBoolean("activo"), arrClienteTO, arrRfcTO);

				clienteRfcTO.add(clienteRfcTO2);
			}
			ps.close();
			conexion.close();
			return clienteRfcTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short updateClienteRfc(ClienteRfcTO clienteRfcTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);

			ps.setInt(1, clienteRfcTO.getIdCliente());
			ps.setInt(2, clienteRfcTO.getIdRfc());
			ps.setBoolean(3, clienteRfcTO.getActivo());
			ps.setInt(4, clienteRfcTO.getIdClienteRfc());
			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			}

			else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

}
